/*
 * Copyright (c) 2021 Bitdefender
 * SPDX-License-Identifier: Apache-2.0
 */
//! Instruction categories.

/// Instruction category.
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[allow(non_camel_case_types)]
pub enum Category {
    I3DNOW,
    AES,
    AESKL,
    AMX,
    APX,
    ARITH,
    AVX,
    AVX10BF16,
    AVX10CMPSFP,
    AVX10CONVERT,
    AVX10INT,
    AVX10MINMAX,
    AVX10PARTCOPY,
    AVX10SCONVERT,
    AVX2,
    AVX2GATHER,
    AVX512,
    AVX512BF16,
    AVX512FP16,
    AVX512VBMI,
    AVX512VP2INTERSECT,
    AVXIFMA,
    AVXNECONVERT,
    AVXVNNI,
    AVXVNNIINT16,
    AVXVNNIINT8,
    BITBYTE,
    BLEND,
    BMI1,
    BMI2,
    BROADCAST,
    CALL,
    CET,
    CLDEMOTE,
    CMOV,
    CMPCCXADD,
    COMPRESS,
    COND_BR,
    CONFLICT,
    CONVERT,
    DATAXFER,
    DECIMAL,
    ENQCMD,
    EXPAND,
    FLAGOP,
    FMA4,
    GATHER,
    GFNI,
    HRESET,
    I386,
    IFMA,
    INTERRUPT,
    IO,
    IOSTRINGOP,
    KL,
    KMASK,
    KNL,
    LKGS,
    LOGIC,
    LOGICAL,
    LOGICAL_FP,
    LWP,
    LZCNT,
    MISC,
    MMX,
    MOVDIR64B,
    MOVDIRI,
    MPX,
    NOP,
    PCLMULQDQ,
    PCONFIG,
    POP,
    PREFETCH,
    PTWRITE,
    PUSH,
    RAOINT,
    RDPID,
    RDRAND,
    RDSEED,
    RDWRFSGS,
    RET,
    ROTATE,
    SCATTER,
    SEGOP,
    SEMAPHORE,
    SGX,
    SHA,
    SHA512,
    SHIFT,
    SM3,
    SM4,
    SMAP,
    SSE,
    SSE2,
    STRINGOP,
    STTNI,
    SYSCALL,
    SYSRET,
    SYSTEM,
    TDX,
    UD,
    UINTR,
    UNCOND_BR,
    UNKNOWN,
    USER_MSR,
    VAES,
    VFMA,
    VFMAPS,
    VNNI,
    VNNIW,
    VPCLMULQDQ,
    VPOPCNT,
    VTX,
    WAITPKG,
    WBNOINVD,
    WIDENOP,
    WIDE_KL,
    X87_ALU,
    XOP,
    XSAVE,
}

#[doc(hidden)]
impl Category {
    #[allow(clippy::too_many_lines)]
    pub(crate) fn from_raw(value: ffi::ND_INS_CATEGORY) -> Option<Self> {
        match value {
            ffi::_ND_INS_TYPE::ND_CAT_INVALID => None,
            ffi::_ND_INS_TYPE::ND_CAT_3DNOW => Some(Category::I3DNOW),
            ffi::_ND_INS_TYPE::ND_CAT_AES => Some(Category::AES),
            ffi::_ND_INS_TYPE::ND_CAT_AESKL => Some(Category::AESKL),
            ffi::_ND_INS_TYPE::ND_CAT_AMX => Some(Category::AMX),
            ffi::_ND_INS_TYPE::ND_CAT_APX => Some(Category::APX),
            ffi::_ND_INS_TYPE::ND_CAT_ARITH => Some(Category::ARITH),
            ffi::_ND_INS_TYPE::ND_CAT_AVX => Some(Category::AVX),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10BF16 => Some(Category::AVX10BF16),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10CMPSFP => Some(Category::AVX10CMPSFP),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10CONVERT => Some(Category::AVX10CONVERT),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10INT => Some(Category::AVX10INT),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10MINMAX => Some(Category::AVX10MINMAX),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10PARTCOPY => Some(Category::AVX10PARTCOPY),
            ffi::_ND_INS_TYPE::ND_CAT_AVX10SCONVERT => Some(Category::AVX10SCONVERT),
            ffi::_ND_INS_TYPE::ND_CAT_AVX2 => Some(Category::AVX2),
            ffi::_ND_INS_TYPE::ND_CAT_AVX2GATHER => Some(Category::AVX2GATHER),
            ffi::_ND_INS_TYPE::ND_CAT_AVX512 => Some(Category::AVX512),
            ffi::_ND_INS_TYPE::ND_CAT_AVX512BF16 => Some(Category::AVX512BF16),
            ffi::_ND_INS_TYPE::ND_CAT_AVX512FP16 => Some(Category::AVX512FP16),
            ffi::_ND_INS_TYPE::ND_CAT_AVX512VBMI => Some(Category::AVX512VBMI),
            ffi::_ND_INS_TYPE::ND_CAT_AVX512VP2INTERSECT => Some(Category::AVX512VP2INTERSECT),
            ffi::_ND_INS_TYPE::ND_CAT_AVXIFMA => Some(Category::AVXIFMA),
            ffi::_ND_INS_TYPE::ND_CAT_AVXNECONVERT => Some(Category::AVXNECONVERT),
            ffi::_ND_INS_TYPE::ND_CAT_AVXVNNI => Some(Category::AVXVNNI),
            ffi::_ND_INS_TYPE::ND_CAT_AVXVNNIINT16 => Some(Category::AVXVNNIINT16),
            ffi::_ND_INS_TYPE::ND_CAT_AVXVNNIINT8 => Some(Category::AVXVNNIINT8),
            ffi::_ND_INS_TYPE::ND_CAT_BITBYTE => Some(Category::BITBYTE),
            ffi::_ND_INS_TYPE::ND_CAT_BLEND => Some(Category::BLEND),
            ffi::_ND_INS_TYPE::ND_CAT_BMI1 => Some(Category::BMI1),
            ffi::_ND_INS_TYPE::ND_CAT_BMI2 => Some(Category::BMI2),
            ffi::_ND_INS_TYPE::ND_CAT_BROADCAST => Some(Category::BROADCAST),
            ffi::_ND_INS_TYPE::ND_CAT_CALL => Some(Category::CALL),
            ffi::_ND_INS_TYPE::ND_CAT_CET => Some(Category::CET),
            ffi::_ND_INS_TYPE::ND_CAT_CLDEMOTE => Some(Category::CLDEMOTE),
            ffi::_ND_INS_TYPE::ND_CAT_CMOV => Some(Category::CMOV),
            ffi::_ND_INS_TYPE::ND_CAT_CMPCCXADD => Some(Category::CMPCCXADD),
            ffi::_ND_INS_TYPE::ND_CAT_COMPRESS => Some(Category::COMPRESS),
            ffi::_ND_INS_TYPE::ND_CAT_COND_BR => Some(Category::COND_BR),
            ffi::_ND_INS_TYPE::ND_CAT_CONFLICT => Some(Category::CONFLICT),
            ffi::_ND_INS_TYPE::ND_CAT_CONVERT => Some(Category::CONVERT),
            ffi::_ND_INS_TYPE::ND_CAT_DATAXFER => Some(Category::DATAXFER),
            ffi::_ND_INS_TYPE::ND_CAT_DECIMAL => Some(Category::DECIMAL),
            ffi::_ND_INS_TYPE::ND_CAT_ENQCMD => Some(Category::ENQCMD),
            ffi::_ND_INS_TYPE::ND_CAT_EXPAND => Some(Category::EXPAND),
            ffi::_ND_INS_TYPE::ND_CAT_FLAGOP => Some(Category::FLAGOP),
            ffi::_ND_INS_TYPE::ND_CAT_FMA4 => Some(Category::FMA4),
            ffi::_ND_INS_TYPE::ND_CAT_GATHER => Some(Category::GATHER),
            ffi::_ND_INS_TYPE::ND_CAT_GFNI => Some(Category::GFNI),
            ffi::_ND_INS_TYPE::ND_CAT_HRESET => Some(Category::HRESET),
            ffi::_ND_INS_TYPE::ND_CAT_I386 => Some(Category::I386),
            ffi::_ND_INS_TYPE::ND_CAT_IFMA => Some(Category::IFMA),
            ffi::_ND_INS_TYPE::ND_CAT_INTERRUPT => Some(Category::INTERRUPT),
            ffi::_ND_INS_TYPE::ND_CAT_IO => Some(Category::IO),
            ffi::_ND_INS_TYPE::ND_CAT_IOSTRINGOP => Some(Category::IOSTRINGOP),
            ffi::_ND_INS_TYPE::ND_CAT_KL => Some(Category::KL),
            ffi::_ND_INS_TYPE::ND_CAT_KMASK => Some(Category::KMASK),
            ffi::_ND_INS_TYPE::ND_CAT_KNL => Some(Category::KNL),
            ffi::_ND_INS_TYPE::ND_CAT_LKGS => Some(Category::LKGS),
            ffi::_ND_INS_TYPE::ND_CAT_LOGIC => Some(Category::LOGIC),
            ffi::_ND_INS_TYPE::ND_CAT_LOGICAL => Some(Category::LOGICAL),
            ffi::_ND_INS_TYPE::ND_CAT_LOGICAL_FP => Some(Category::LOGICAL_FP),
            ffi::_ND_INS_TYPE::ND_CAT_LWP => Some(Category::LWP),
            ffi::_ND_INS_TYPE::ND_CAT_LZCNT => Some(Category::LZCNT),
            ffi::_ND_INS_TYPE::ND_CAT_MISC => Some(Category::MISC),
            ffi::_ND_INS_TYPE::ND_CAT_MMX => Some(Category::MMX),
            ffi::_ND_INS_TYPE::ND_CAT_MOVDIR64B => Some(Category::MOVDIR64B),
            ffi::_ND_INS_TYPE::ND_CAT_MOVDIRI => Some(Category::MOVDIRI),
            ffi::_ND_INS_TYPE::ND_CAT_MPX => Some(Category::MPX),
            ffi::_ND_INS_TYPE::ND_CAT_NOP => Some(Category::NOP),
            ffi::_ND_INS_TYPE::ND_CAT_PCLMULQDQ => Some(Category::PCLMULQDQ),
            ffi::_ND_INS_TYPE::ND_CAT_PCONFIG => Some(Category::PCONFIG),
            ffi::_ND_INS_TYPE::ND_CAT_POP => Some(Category::POP),
            ffi::_ND_INS_TYPE::ND_CAT_PREFETCH => Some(Category::PREFETCH),
            ffi::_ND_INS_TYPE::ND_CAT_PTWRITE => Some(Category::PTWRITE),
            ffi::_ND_INS_TYPE::ND_CAT_PUSH => Some(Category::PUSH),
            ffi::_ND_INS_TYPE::ND_CAT_RAOINT => Some(Category::RAOINT),
            ffi::_ND_INS_TYPE::ND_CAT_RDPID => Some(Category::RDPID),
            ffi::_ND_INS_TYPE::ND_CAT_RDRAND => Some(Category::RDRAND),
            ffi::_ND_INS_TYPE::ND_CAT_RDSEED => Some(Category::RDSEED),
            ffi::_ND_INS_TYPE::ND_CAT_RDWRFSGS => Some(Category::RDWRFSGS),
            ffi::_ND_INS_TYPE::ND_CAT_RET => Some(Category::RET),
            ffi::_ND_INS_TYPE::ND_CAT_ROTATE => Some(Category::ROTATE),
            ffi::_ND_INS_TYPE::ND_CAT_SCATTER => Some(Category::SCATTER),
            ffi::_ND_INS_TYPE::ND_CAT_SEGOP => Some(Category::SEGOP),
            ffi::_ND_INS_TYPE::ND_CAT_SEMAPHORE => Some(Category::SEMAPHORE),
            ffi::_ND_INS_TYPE::ND_CAT_SGX => Some(Category::SGX),
            ffi::_ND_INS_TYPE::ND_CAT_SHA => Some(Category::SHA),
            ffi::_ND_INS_TYPE::ND_CAT_SHA512 => Some(Category::SHA512),
            ffi::_ND_INS_TYPE::ND_CAT_SHIFT => Some(Category::SHIFT),
            ffi::_ND_INS_TYPE::ND_CAT_SM3 => Some(Category::SM3),
            ffi::_ND_INS_TYPE::ND_CAT_SM4 => Some(Category::SM4),
            ffi::_ND_INS_TYPE::ND_CAT_SMAP => Some(Category::SMAP),
            ffi::_ND_INS_TYPE::ND_CAT_SSE => Some(Category::SSE),
            ffi::_ND_INS_TYPE::ND_CAT_SSE2 => Some(Category::SSE2),
            ffi::_ND_INS_TYPE::ND_CAT_STRINGOP => Some(Category::STRINGOP),
            ffi::_ND_INS_TYPE::ND_CAT_STTNI => Some(Category::STTNI),
            ffi::_ND_INS_TYPE::ND_CAT_SYSCALL => Some(Category::SYSCALL),
            ffi::_ND_INS_TYPE::ND_CAT_SYSRET => Some(Category::SYSRET),
            ffi::_ND_INS_TYPE::ND_CAT_SYSTEM => Some(Category::SYSTEM),
            ffi::_ND_INS_TYPE::ND_CAT_TDX => Some(Category::TDX),
            ffi::_ND_INS_TYPE::ND_CAT_UD => Some(Category::UD),
            ffi::_ND_INS_TYPE::ND_CAT_UINTR => Some(Category::UINTR),
            ffi::_ND_INS_TYPE::ND_CAT_UNCOND_BR => Some(Category::UNCOND_BR),
            ffi::_ND_INS_TYPE::ND_CAT_UNKNOWN => Some(Category::UNKNOWN),
            ffi::_ND_INS_TYPE::ND_CAT_USER_MSR => Some(Category::USER_MSR),
            ffi::_ND_INS_TYPE::ND_CAT_VAES => Some(Category::VAES),
            ffi::_ND_INS_TYPE::ND_CAT_VFMA => Some(Category::VFMA),
            ffi::_ND_INS_TYPE::ND_CAT_VFMAPS => Some(Category::VFMAPS),
            ffi::_ND_INS_TYPE::ND_CAT_VNNI => Some(Category::VNNI),
            ffi::_ND_INS_TYPE::ND_CAT_VNNIW => Some(Category::VNNIW),
            ffi::_ND_INS_TYPE::ND_CAT_VPCLMULQDQ => Some(Category::VPCLMULQDQ),
            ffi::_ND_INS_TYPE::ND_CAT_VPOPCNT => Some(Category::VPOPCNT),
            ffi::_ND_INS_TYPE::ND_CAT_VTX => Some(Category::VTX),
            ffi::_ND_INS_TYPE::ND_CAT_WAITPKG => Some(Category::WAITPKG),
            ffi::_ND_INS_TYPE::ND_CAT_WBNOINVD => Some(Category::WBNOINVD),
            ffi::_ND_INS_TYPE::ND_CAT_WIDENOP => Some(Category::WIDENOP),
            ffi::_ND_INS_TYPE::ND_CAT_WIDE_KL => Some(Category::WIDE_KL),
            ffi::_ND_INS_TYPE::ND_CAT_X87_ALU => Some(Category::X87_ALU),
            ffi::_ND_INS_TYPE::ND_CAT_XOP => Some(Category::XOP),
            ffi::_ND_INS_TYPE::ND_CAT_XSAVE => Some(Category::XSAVE),
        }
    }
}
